
package jfireeagle.xml;

import jfireeagle.GpsBox;
import jfireeagle.GpsCoordinate;
import jfireeagle.Location;
import jfireeagle.LocationHierarchy;
import jfireeagle.Locations;
import jfireeagle.PlaceId;
import jfireeagle.Response;
import jfireeagle.User;
import jfireeagle.WhereOnEarthId;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.extended.ToStringConverter;
import com.thoughtworks.xstream.io.xml.XppDriver;

public class XStreamFactory
{
	public static XStream createXStream()
	{
		
		XStream xstream = new XStream(new XppDriver());

		
 		xstream.registerConverter(new CalendarConverter(), XStream.PRIORITY_VERY_HIGH);
 		
 		try
		{
			xstream.registerConverter(new ToStringConverter(GpsCoordinate.class), XStream.PRIORITY_VERY_HIGH);
	 		xstream.registerConverter(new ToStringConverter(GpsBox.class), XStream.PRIORITY_VERY_HIGH);
	 		xstream.registerConverter(new ToStringConverter(WhereOnEarthId.class), XStream.PRIORITY_VERY_HIGH);
	 		xstream.registerConverter(new ToStringConverter(PlaceId.class), XStream.PRIORITY_VERY_HIGH);
		} 
 		catch (NoSuchMethodException e)
		{
			throw new RuntimeException(e);
		}
		
		xstream.addImplicitCollection(Response.class, "users", User.class);
		xstream.addImplicitCollection(Locations.class, "locations", Location.class);
		xstream.addImplicitCollection(LocationHierarchy.class, "locations", Location.class);
		
		xstream.aliasField("location", Locations.class, "locations");
		xstream.aliasField("location", LocationHierarchy.class, "locations");
		
		
		xstream.alias("user", User.class);
		xstream.alias("location-hierarchy", LocationHierarchy.class);
		xstream.alias("woeid", WhereOnEarthId.class);
		xstream.alias("place-id", PlaceId.class);
		xstream.alias("georss:box", GpsBox.class);
		xstream.alias("georss:point", GpsCoordinate.class);
		xstream.alias("rsp", Response.class);
		xstream.alias("location", Location.class);
		xstream.alias("locations", Locations.class);
		
		xstream.aliasField("level-name", Location.class, "levelName");
		xstream.aliasField("located-at", Location.class, "locatedAt");
		xstream.aliasField("normal-name", Location.class, "normalName");
		xstream.aliasField("place-id", Location.class, "placeId");
		xstream.aliasField("location-hierarchy", User.class, "locationHierarchy");
		xstream.aliasField("georss:point", Location.class, "gpsCoordinate");
		xstream.aliasField("georss:box", Location.class, "box");
		xstream.aliasField("woeid", Location.class, "whereOnEarthId");

		xstream.aliasAttribute(Locations.class, "count", "count");
		xstream.aliasAttribute(Locations.class, "start", "start");
		xstream.aliasAttribute(Locations.class, "total", "total");
		
		
		xstream.aliasAttribute(Location.class, "bestGuess", "best-guess");
		
		xstream.aliasAttribute(LocationHierarchy.class, "timeZone", "timezone");
		
		return xstream;
		
	}
}
